import axios from 'axios'
// import CryptoJS from 'crypto-js'

import { ElMessage } from 'element-plus'
import { buildHeaderSign, getBaseURL } from '../utils/headerSign'
import useUserStore from '../stores/user'

const api = axios.create({
  baseURL: getBaseURL(),
  timeout: 1000 * 60,
  responseType: 'json',
})

api.interceptors.request.use((request) => {
  // 全局拦截请求发送前提交的参数
  const userStore = useUserStore().userInfo
  const displayName = useUserStore().displayName
  const companyId = useUserStore().companyId
  // 判断请求的类型：如果是post请求就把默认参数拼到data里面；如果是get请求就拼到params里面
  const param_json = {}
  if (request.method === 'post') {
    // 创建人和修改人信息
    request.data = {
      request_user_id: userStore.id,
      request_by: displayName,
      ...request.data,
    }
    if (!(request.data && request.data.company_id > 0)) {
      request.data.company_id = companyId
    }
    if (!(request.data.platform_type && request.data.platform_type != '')) {
      request.data.platform_type = 'pc'
    }
    // 排序顺序将是：数字、大写字母、下划线、小写字母
    const sortedKeys = Object.keys(request.data).sort()
    sortedKeys.forEach((key) => {
      if (request.data[key] != undefined && request.data[key] != null) {
        param_json[key] = request.data[key] // POST保持数据类型不变
      }
    })
  } else if (request.method === 'get') {
    // 创建人和修改人信息
    request.params = {
      request_user_id: userStore.id,
      request_by: displayName,
      ...request.params,
    }
    if (!(request.params && request.params.company_id > 0)) {
      request.params.company_id = companyId
    }
    if (!(request.params.platform_type && request.params.platform_type != '')) {
      request.params.platform_type = 'pc'
    }
    // 排序顺序将是：数字、大写字母、下划线、小写字母
    const sortedKeys = Object.keys(request.params).sort()
    sortedKeys.forEach((key) => {
      if (request.params[key] != undefined && request.params[key] != null) {
        if (typeof request.params[key] === 'object' || Array.isArray(request.params[key])) {
          param_json[key] = request.params[key]
        } else {
          param_json[key] = request.params[key].toString() // GET转化为字符串数据类型
        }
      }
    })
  }

  // 设置请求头
  // step1：以app_key、method、param_json、timestamp、version这个顺序，把以上参数的键值对依次拼接在一起
  // step2：在上一步基础上，在头尾拼接app_secret
  // step3：使用MD5算法，计算签名串
  if (request.headers) {
    const url = request.url ? request.url.toString() : ''
    const headerSign = buildHeaderSign(url, userStore, param_json)
    request.headers = Object.assign({}, request.headers, headerSign)
  }
  return request
})

api.interceptors.response.use(
  (response) => {
    /**
     * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
     * 假设返回数据格式为：{ code: 100, msg: '', data: [] }
     * 规则是当 code 为 100 时表示请求成功，为 0 时表示接口需要登录或者登录状态失效，需要重新登录
     * 请求出错时 msg 会返回错误信息
     */
    const res = response.data
    // console.log('成功返回结果：', res)
    if (res.code === -1) {
      useUserStore().logout()
    } else if (res.code !== 100 && res.code !== 101) {
      if (res.msg && res.msg !== '' && res.code !== 200) {
        // 错误提示 code=200不提示
        ElMessage.error(res.msg)
      }
      return Promise.reject(res)
    }
    return Promise.resolve(res)
  },
  (error) => {
    console.log('失败返回结果：', error)
    let message = error.message
    if (message === 'Network Error') {
      message = '后端网络故障'
    } else if (message.includes('timeout')) {
      message = '接口请求超时'
    } else if (message.includes('Request failed with status code')) {
      message = `接口${message.substr(message.length - 3)}异常`
      // if (error.response.status === 401) {
      //   useUserStore().logout()
      // }
    }
    ElMessage.error(message)
    return Promise.reject(error)
  }
)

export default api
